package kurtis.rx.androidexamples;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ProgressBar;

import java.util.List;
import java.util.concurrent.Callable;

import rx.Observable;
import rx.Observer;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;

public class Example2Activity extends AppCompatActivity {

    private Subscription mTvShowSubscription;
    private RecyclerView mTvShowListView;
    private ProgressBar mProgressBar;
    private SimpleStringAdapter mSimpleStringAdapter;
    private RestClient mRestClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mRestClient = new RestClient(this);
        configureLayout();
        createObservable();
    }

    /**
     * 使用Observable.fromCallable()方法有两点好处：

     1. 获取要发送的数据的代码只会在有Observer订阅之后执行。

     2. 获取数据的代码可以在子线程中执行
     */
    private void createObservable() {
//      创建一个被观察者：被订阅的时候执行Callable
//      call返回值自定义
        Observable<List<String>> tvShowObservable = Observable.fromCallable(new Callable<List<String>>() {
            @Override
            public List<String> call() {
//              在子线程中睡了5秒
                return mRestClient.getFavoriteTvShows();
            }
        });
//      添加观察者（这里只添加了一个，应该可以添加多个）
//      每添加一个观察者就会返回一个被订阅者对象，这些对象在onDestroy方法中需要解除订阅
        mTvShowSubscription = tvShowObservable
                /*
                * subscribeOn会修改我们刚刚创建的Observable。
                * 在默认情况下Observable的所有代码，包括刚才说到的只有在被订阅之后才会执行的代码，都会在主线程中运行。
                * 而通过subscribeOn()方法，call()方法可以在其他线程中执行。
                * */
                .subscribeOn(Schedulers.io())
                /*
                * 数据会被发送到主线程中执行
                * */
                .observeOn(AndroidSchedulers.mainThread())
                /*
                * Callable只会在有Observer订阅后运行
                * subscriable 即订阅方法
                * */
                .subscribe(
                        new Observer<List<String>>() {
                            @Override
                            public void onCompleted() {

                            }

                            @Override
                            public void onError(Throwable e) {

                            }

                            @Override
                            public void onNext(List<String> tvShows) {
//                              改方法放在主线程执行
                                displayTvShows(tvShows);
                            }
                        });

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        if (mTvShowSubscription != null && !mTvShowSubscription.isUnsubscribed()) {
            mTvShowSubscription.unsubscribe();
        }
    }

    private void displayTvShows(List<String> tvShows) {
        mSimpleStringAdapter.setStrings(tvShows);
        mProgressBar.setVisibility(View.GONE);
        mTvShowListView.setVisibility(View.VISIBLE);
    }

    private void configureLayout() {
        setContentView(R.layout.activity_example_2);
        mProgressBar = (ProgressBar) findViewById(R.id.loader);
        mTvShowListView = (RecyclerView) findViewById(R.id.tv_show_list);
        mTvShowListView.setLayoutManager(new LinearLayoutManager(this));
        mSimpleStringAdapter = new SimpleStringAdapter(this);
        mTvShowListView.setAdapter(mSimpleStringAdapter);
    }
}
